package com.example.Controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.Service.impl.RawMaterialServiceImpl;
import com.example.Service.impl.SupplierServiceImpl;
import com.example.pojo.RawMaterial;
import com.example.pojo.Supplier;
import com.example.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;

@RestController
@RequestMapping("/stash")
@Api(tags = "原材料接口")
public class RawMaterialController {

    @Resource
    private RawMaterialServiceImpl RawMaterialServiceImpl;


    @Resource
    private SupplierServiceImpl supplierServiceImpl;


    @GetMapping
    @ApiImplicitParams({
            @ApiImplicitParam(name = "name",value = "商品名称"),
            @ApiImplicitParam(name = "PageNum",value = "页数"),
            @ApiImplicitParam(name = "PageSize",value = "页大小")
    })
    @ApiOperation("获取原材料列表")
    public  Object getList(@RequestParam(value = "name",defaultValue = "")String name,
                           @RequestParam(value = "PageNum",defaultValue = "1")int PageNum,
                           @RequestParam(value = "PageSize",defaultValue ="4")int PageSize){
        HashMap <String,Object> map = new HashMap<>();
        QueryWrapper<RawMaterial> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.hasText(name),"name",name);    //这里已经查出我们所需要的内容，但是他还是存在一些问题，比如他的供应商是
                                                                            // 字符串类型的数字，我们需要把他“加工”一下，通过supplierServiceImpl
                                                                            // 来查询出供应商的名称
        Page<RawMaterial> page = new Page<>(PageNum,PageSize);   //通过Page来包装我们的数据，因为我们需要分页
        Page<RawMaterial> shoppingPage = RawMaterialServiceImpl.page(page, queryWrapper);   //查询出分页后的数据,把他包装起来
        for (RawMaterial rawMaterial :shoppingPage.getRecords()) {    //这里我们通过循环来查询出供应商的名称
             QueryWrapper<Supplier> wrapper=new QueryWrapper<>();
             Integer supplierId=Integer.valueOf(rawMaterial.getSupplier());   //这里我们通过字符串来获取供应商的id,因为他是String类型的数据，所以我们需要把他转化成哦我们需要的形式
             wrapper.eq("supplier_id",supplierId);      //这里我们通过供应商的id来查询出供应商的名称
             Supplier supplier = supplierServiceImpl.getOne(wrapper);
             rawMaterial.setSupplier(supplier.getSupplierName());  //这里我们通过Supplier供应商的名称来设置rawMaterial供应商的名称
        }
        map.put("list",shoppingPage.getRecords());      //这里我们通过shoppingPage.getRecords()来获取我们的数据
        map.put("total",shoppingPage.getTotal());      //这里我们通过shoppingPage.getTotal()来获取我们的数据总数
        map.put("pages",shoppingPage.getPages());        //这里我们通过shoppingPage.getPages()来获取我们的总页数
        return new Result<>("200","查询成功",map);    //Ok,打包给前端
    }


    @PostMapping
    public Object add(@RequestBody RawMaterial rawMaterial){
        RawMaterial raw= RawMaterialServiceImpl.getOne(new QueryWrapper<RawMaterial>().eq("name",rawMaterial.getName()));  //这里我们通过name来查询出我们的数据
        if (raw!=null) {                             //如果有重复的话，我们只增加数量,不增加条数
            Integer num = rawMaterial.getNumber();   //这里我们通过rawMaterial.getNumber()来获取我们的数量
            raw.setNumber(num + raw.getNumber());    //这里我们通过num+raw.getNumber()来获取我们的数量
            RawMaterialServiceImpl.updateById(raw);   //这里我们通过updateById来更新我们的数据
            return new Result<>("200", "添加成功", null);  //把修改结果传给前端
        }
        RawMaterialServiceImpl.save(rawMaterial);   //这里我们通过save来保存我们的数据，这是没有意外情况的添加
        return new Result<>("200","添加成功",null);
    }


    @DeleteMapping("delete/{id}")
    public Object delete(@PathVariable int id){
        //删除内容，我们使用逻辑删除
        RawMaterialServiceImpl.removeById(id);
        return new Result<>("200","删除成功",null);
    }


    @PutMapping
    public Object update(@RequestBody RawMaterial shopping){
        boolean update = RawMaterialServiceImpl.updateById(shopping);
        if (update){
            return new Result<>("200","修改成功",null);
        }
        return  new Result<>("500","修改失败",null);
    }
}
